李绪成的一亩三分地

——忙着,快乐着 《Java语言程序设计(Java7)——入门与提高篇》出版发行,清华大学出版社,2014.2...

JSP培训(11)——Java Web中的安全控制
 
目标:
l         掌握登录之后的一般处理过程;
l         能够为每个页面添加安全控制;
l         能够共享验证代码;
l         使用过滤器对权限进行验证;
l         能够对文件的局部内容进行验证;
l         掌握安全验证码的基本实现方式;
l         通过异常处理增强安全性。
主要内容:
l         通过修改前面的登录功能,分别对管理员和普通用户的登录进行处理;
l         为管理员才能访问的页面添加控制;
l         共享各个页面中的控制代码,使用专门的文件,然后在需要的时候调用;
l         使用过滤器降低重复验证代码;
l         通过标准标签库完成页面局部信息的安全控制;
l         介绍安全验证码的基本实现方式;
1、完善登录功能
正常情况下,管理员登录成功之后跳转到管理员默认工作界面;普通用户登录之后跳转到普通用户默认工作界面;用户登录失败后跳转到登录界面重新登录。
为了完成这个功能,需要编写管理员界面和普通用户界面。
管理员界面对应的文件为manager.jsp,代码如下:
-----------------------------代码manager.jsp----------------------------------
<%@ page contentType="text/html;charset=gb2312"%>
管理员操作界面
-------------------------------------------------------------------------------------
普通用户界面对应的文件为commonuser.jsp,代码如下:
-----------------------------代码commonuser.jsp----------------------------------
<%@ page contentType="text/html;charset=gb2312"%>
普通用户界面
-------------------------------------------------------------------------------------
修改登录的Servlet,修改后的代码如下:
-----------------------------代码LoginProcess.java----------------------------------
package servlet;
 
import javabean.User;
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
public class LoginProcess extends HttpServlet {
 
 
       public void doGet(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
              doPost(request,response);
       }
 
 
       public void doPost(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
              // 获取信息
              String username = request.getParameter("username");
              String userpass = request.getParameter("userpass");
             
              // 调用JavaBean
              User user = new User();
              user = user.findUserByName(username);
                           
              String forward;
              if(user==null){
                     forward="failure.jsp";
              }else if(user.getUserpass().equals(userpass)){
                     if(user.getUsertype().equals("1")){
                            forward="manager.jsp";
                     }
                     else{
                            forward="commonuser.jsp";
                     }                         
              }else{
                     forward="failure.jsp";
              }
             
              RequestDispatcher rd = request.getRequestDispatcher(forward);
              rd.forward(request,response);
       }
 
}
--------------------------------------------------------------------------------------------
2、为每个界面添加安全控制
上面的实例中登录成功后会跳转到管理员界面或者普通用户界面,但是如果用户直接输入管理员界面,就会跳过登录界面。例如用户可以直接输入:http://127.0.0.1:8080/ch11/manager.jsp。
为了解决这个问题,在每个有安全限制的界面都应该增加安全控制。需要完成两项工作:
l         在登录之后把用户的信息写入到session中;
l         在每个页面中,从session中获取信息进行验证;
在登录之后把用户信息写入到session中,下面是修改后的LoginProcess.java代码:
-----------------------------代码LoginProcess.java----------------------------------
package servlet;
 
import javabean.User;
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
public class LoginProcess extends HttpServlet {
 
 
       public void doGet(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
              doPost(request,response);
       }
 
 
       public void doPost(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
              // 获取信息
              String username = request.getParameter("username");
              String userpass = request.getParameter("userpass");
             
              // 调用JavaBean
              User user = new User();
              user = user.findUserByName(username);
             
              // 得到session对象
              HttpSession session = request.getSession(true);
                           
              String forward;
              if(user==null){
                     forward="failure.jsp";
              }else if(user.getUserpass().equals(userpass)){
                     if(user.getUsertype().equals("1")){
                            // 在session对象中存储信息
                            session.setAttribute("usertype","1");
                            forward="manager.jsp";
                     }
                     else{
                            session.setAttribute("usertype","0");
                            forward="commonuser.jsp";
                     }                         
              }else{
                     forward="failure.jsp";
              }
             
              RequestDispatcher rd = request.getRequestDispatcher(forward);
              rd.forward(request,response);
       }
 
}
----------------------------------------结束---------------------------------------------------------
以commonuser.jsp为例介绍如何在每个文件中进行安全控制,下面是修改后的代码:
-----------------------------代码commonuser.jsp----------------------------------
<%@ page contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:if test="${usertype!=/"0/"}">
   <jsp:forward page="login.jsp"/>
</c:if>
普通用户界面
---------------------------------------结束------------------------------------------------------------
这样,如果不登录而直接访问commonuser.jsp就会跳转到登录界面。
3、采用专门的文件进行验证
因为很多页面都要编写验证的代码,所以可以把这些代码放在一个文件中进行共享,需要的使用调用共享文件。下面仍然以commonuser.jsp为例介绍如何实现验证代码的共享。
使用专门的文件存放共享代码:
-----------------------------代码check.jsp----------------------------------
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:if test="${usertype!=/"0/"}">
   <jsp:forward page="login.jsp"/>
</c:if>
---------------------------------------结束---------------------------------------------------------------
在需要验证的文件中导入这个专门的文件。以commonuser.jsp为例:
-----------------------------代码commonuser.jsp----------------------------------
<%@ page contentType="text/html;charset=gb2312"%>
<%@ include file="check.jsp" %>
普通用户界面
-----------------------------------------结束---------------------------------------------------------
使用include指令包含目标文件,在把JSP转换成Java文件的时候,会把目标文件的代码拷贝到当前文件。
再运行测试,结果是相同的。
4、使用过滤器对权限进行验证
把具有相同权限要求的文件放在相同的文件夹下,对文件夹的访问进行统一的过滤。
编写用于过滤的Servlet,代码如下:
-----------------------------代码CommonCheck.java----------------------------------
package servlet;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class CommonCheck extends HttpServlet implements Filter {
 
public void doFilter(ServletRequest arg0, ServletResponse arg1,
               FilterChain arg2) throws IOException, ServletException {
       
        // 得到session
        HttpSession session = ((HttpServletRequest)arg0).getSession(true);
        // 得到用户类型
        String usertype = (String)session.getAttribute("usertype");
        // 进行判断
        if(usertype==null || usertype.equals("1")){
               ((HttpServletResponse)arg1).sendRedirect("./../login.jsp");
        }
        // 继续调用其他的过滤器
        try{
               arg2.doFilter(arg0, arg1);
        }catch(Exception e){}
}
 
public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
 
}
 
}
--------------------------------------------结束----------------------------------------------------------
配置过滤器,过滤器的配置与Servlet的配置非常类似,在web.xml中添加如下代码:
 <filter>
    <filter-name>CommonCheck</filter-name>
    <filter-class>servlet.CommonCheck</filter-class>
</filter>
 <filter-mapping>
    <filter-name>CommonCheck</filter-name>
    <url-pattern>/commonuser/*</url-pattern>
 </filter-mapping>
url-pattern中使用/commonuser/*,这样只要访问commonuser这个文件夹,就会访问这个过滤器,如果用户没有登录,将不能访问目标文件。
测试:为了测试需要创建一个文件夹commonuser,把commonuser.jsp拷贝到commonuser文件中。
测试过程如下:
先直接访问:http://127.0.0.1:8080/ch11/commonuser/commonuser.jsp,你会发现显示的是登录界面,就是因为没有登录而访问了commonuser中的文件,过滤器进行处理,然后跳转到登录界面了。
然后在登录界面输入正确的用户名和口令,然后再次在地址栏中输入上面的地址,这时候会看到commonuser.jsp文件的内容。表示验证通过。
5、对文件局部内容的安全进行控制
    前面介绍的都是文件级别的安全控制,有时候需要对文件中部分内容进行安全控制,例如物品信息列表这样的界面,如果当前用户是管理员,则可以在其中完成管理功能,而对于普通用户来说,而不可以,这就需要进行局部的控制。局部控制主要是通过标准标签库中的<c:if>标签来完成。
6、安全验证码的基本实现方式
为了增强网站的安全性,很多网站采用了很多安全措施。例如SSL方式的访问、U盾和口令卡(工商银行)、信息加密等。安全验证码是现在比较流行的有效的一个安全措施,能够有效的解决用户通过遍历所有可能的组合来破解密码的问题。
基本工作原理如下:每次客户端访问服务器的时候,服务器会生成验证码,以图形的形式显示给用户,同时在服务器上保留备份,用户在提交信息的时候需要把验证码同时提交道服务器,服务器接收到验证码之后与服务器端的验证码进行比较,如果相同则进行处理。如果不同,则让用户重新输入。因为每次都变化,所有用户如果想破解密码,首先要应付变化的安全验证码,所以加大了破解的难度。
7、通过异常处理增强安全性
有时候用户的攻击是根据网站所使用的服务器来进行了,因为很多服务器都有自己的bug。如果不能对异常进行有效的处理,错误信息会显示在客户端,从错误信息中可以让客户发现服务器的版本信息,这样就为用户的恶意攻击提供了便利条件。
例如,用于输入:http://127.0.0.1:8080/ch11/abc.jsp
而abc.jsp是一个不存在的文件,这时候如果不进行处理,会在客户端显示服务器的信息。
如果能够对各种异常进行处理,不让用户看到你所使用技术和服务器,这样客户进行攻击的难度就加大了。
曾经有一个学生作了这样一件事情:使用JSP技术完成了一个网站,然后通过配置之后,客户端访问的时候,使用的文件后缀名都是php,给人的感觉就像是采用php技术编写的网站。

 

参考教材:Java Web程序设计基础教程

阅读更多
个人分类: 102 Java Web技术
想对作者说点什么? 我来说一句

Java并发安全控制培训

2015年09月22日 829KB 下载

百度地图视频教程javaweb

2017年06月12日 31B 下载

清华大学JAVA培训JSP教材

2009年04月03日 1.99MB 下载

北京圣思园Java.Web培训视频源码

2016年07月17日 44.48MB 下载

JavaWeb全套设计培训PPT及练习

2016年08月11日 8.36MB 下载

没有更多推荐了,返回首页

不良信息举报

JSP培训(11)——Java Web中的安全控制

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭