如果未经过身份验证,我该如何阻止用户直接访问页面?

时间:2014-03-20 10:29:39

标签: jsp custom-tags

我正在使用自定义标记,我想知道如何在不进行身份验证的情况下阻止用户直接访问我的应用程序页面。下面是视图页面编码,请让我知道如何去做,我甚至尝试使用页面会话指令但是没有用。

  <html>
  <head>
  <script>
      function check(submit)
      {
    var x = document.getElementById("r");
    var xlength=x.value.length;
    if(xlength!=5 || x=="")
  {
               alert("Enter 5 digit Employee Id");
               document.getElementById("r").focus();
return false;
 }
 }
 </script>  
  </head>
  <body>
  <form method=post>
  <input type=text style="color:grey" name=reqno id=r 

  value=requestno maxlength="5" onFocus="if 

  (this.value==this.defaultValue) this.value=''" onblur="if 

  (this.value=='') this.value = this.defaultValue" >
  </br>
  <input type = submit name = submit value = Submit 

   onclick="return check(this)" >
  <input type = submit name = back value = Back>

<%

  String r=request.getParameter("reqno");
  String btn=request.getParameter("submit");
  String btn1=request.getParameter("back");
  HttpSession session1=request.getSession();
  session1.setAttribute("requestno",r);
 if (btn!=null)
   response.sendRedirect("findrequest1.jsp");
 else if (btn1!=null)
   response.sendRedirect("selectaction.jsp");


%>
</form>
</body>
</html>

这是登录页面

<jsp:useBean id="theBean" class="pack.java.MyModel"/>
<jsp:setProperty name="theBean" property="name" param="userName"/>
<jsp:setProperty name="theBean" property="pass" param="userPass"/>
<%@ taglib uri="taglib1.tld" prefix="easy" %>
<html>
<head>
<script>
 history.forward();
</script>
</head>
<header>
<h4 align="right"><a href="projectregister.jsp">Register Now</a></br>
</h4>
</header>
 <form = "loginform" method="post">
<h1>Login please</h1>
Enter username : <input type = text  name = userName  >
</br>
Enter password : <input type = password  name = userPass  >
</br>
<input type = submit name = submit value = submit>
</br>
<%
String btn = request.getParameter("submit");
String uu= request.getParameter("userName");
String pp= request.getParameter("userPass");
HttpSession sessions=request.getSession();
String st=(String)request.getAttribute("user");

  if(request.getParameter("userName")!="" && request.getParameter("userPass")!="")
{
  if (btn!=null )
{

%>
<easy:myTag/>
<% 
}
}
%>
</form>
</body>
</html>

这是一个过滤器

       package pack.java;
       import java.io.*;
       import javax.servlet.*;

       public class loginfilter implements Filter
     {
        String aa;
    public void destroy()
        {
        }

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
 {
    aa=request.getRequestURI();
    chain.doFilter(request, response);
 }

  public void init(FilterConfig fconfig) throws ServletException
 {
  }

}

这是登录(控制器)页面

   package pack.java;
   import pack.java.MyModel;
   import java.io.*;
   import java.lang.*;
   import javax.servlet.*;
   import javax.servlet.http.*;
   import javax.servlet.jsp.*;
   import javax.servlet.jsp.tagext.*;
   import java.sql.*;
    public class MyController extends TagSupport
 {

HttpServletRequest request;
HttpServletResponse response;
String msg="";
String empid="";
    public int doStartTag()throws JspException
{

 request=(HttpServletRequest)pageContext.getRequest();              
 response=(HttpServletResponse)pageContext.getResponse();
    return EVAL_PAGE;
 }  

    public void check()
 {

   HttpSession mysession=request.getSession();

    JspWriter out=pageContext.getOut();
    int f=0;
    try
  {
   Class.forName("oracle.jdbc.driver.OracleDriver");
  }
   catch(ClassNotFoundException ex)
  {
    msg=ex.getMessage();
  }
    try 
 {   
     Connection con;
     CallableStatement stmt;
     ResultSet rs;
     String aa=(String)MyModel.name.trim();
     String bb=(String)MyModel.pass.trim();

 if(!aa.matches(".*[%#^<>&;'\0-].*") && !bb.matches(".*[%#^<>&;'\0-].*"))
{

 con=    DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","gaurav","oracle");
    stmt=con.prepareCall("select usercheck1(?,?) from dual");
    stmt.setString(1,aa);
    stmt.setString(2,bb);       
    rs=stmt.executeQuery();

  while (rs.next())
 {
   empid=rs.getString (1);     
  mysession.setAttribute("user",empid);

  if(empid!=null)
 {
  response.sendRedirect("/Myjsp/selectaction.jsp");
 }
   else 
   out.println("Invalid Details");
 }
 }
  else
  out.println("Invalid Details");
}
 catch(SQLException ex)
 {
   msg=ex.getMessage();
 }         
  catch(Exception ex)
 {
  msg=ex.getMessage();
} 

} 
   public int doEndTag() throws JspException
{

    check();
   return EVAL_PAGE;
 }

}

在web.xml文件中,下面是我输入的代码

<filter>
    <filter-name>loginfilter</filter-name>
    <filter-class>pack.java</filter-class>
 </filter>


 <filter-mapping>
    <filter-name>loginfilter</filter-name>  
    <url-pattern>/*</url-pattern>
 </filter-mapping> 

3 个答案:

答案 0 :(得分:1)

您可以使用部署描述符中的安全性约束以声明方式执行此操作。

基本上,您说“这组资源只能由给定的一组规则中的用户使用给定的HTTP方法集”访问,如下所示:

网址/安全/ *后面的资源仅供“管理员”中经过身份验证的用户访问。作用。

  

<web-resource-collection>
  <web-resource-name>secured</web-resource-name>
  <description>Secured pages</description>
  <url-pattern>/secured/*</url-pattern>
  <http-method>POST</http-method>
  <http-method>GET</http-method>
</web-resource-collection>

<auth-constraint>
  <description>Administrative users</description>
  <role-name>admin</role-name>
</auth-constraint>

它需要一些设置 - 安全领域等,登录表单配置,但这意味着您的安全设置不是以编程方式完成的,而是采用工具支持和抽象的声明方式。这有助于保持代码清洁和集中。

另请阅读此http://www.tutorialspoint.com/jsp/jsp_security.htm它会给你一个好主意

答案 1 :(得分:0)

您可以使用过滤器来处理此类场景。过滤器是用于在客户端访问后端资源之前拦截来自客户端的请求的类。 您也可以在到达客户端之前使用过滤器,即拦截响应。在这里你可以使用前者。

步骤如下:

1.当用户成功登录时,您可以设置一些会话属性以指示用户已登录

 session.setAttribute("isUserLoggedIn",true);

2.您可以编写一个实现javax.servlet.filter接口的类并覆盖doFilter方法。在doFilter方法中,您可以检查是否已设置“isUserLoggedIn”属性。如果已设置,则可以允许该请求继续,否则您可以将用户转发到登录页面或任何您想要的自定义页面。

您可以决定要调用哪个URL模式。如果您希望为每个请求调用此过滤器,例如对于每个URL模式,您可以在web.xml中说如下所示:

  <url-pattern>/*</url-pattern>

您可以了解过滤器的工作原理@

http://www.oracle.com/technetwork/java/filters-137243.html

希望这有帮助!

答案 2 :(得分:0)

对于JSP / HTML页面,有很多方法可以防止用户直接访问。最简单的方法是将所有这些页面移动到用户无法从URL访问的WEB-INF文件夹中。这也意味着您仅允许用户访问servlet操作,而完全禁止用户访问JSP页面。以here为例。

对于身份验证,您可以使用servlet过滤器或常见的servlet方法,here