在做一个java web 应用的时候,经常要涉及到三个URL的安全问题:

1、没有登录,直接输入对应的URL就可以进入页面;

2、权限问题,普通用户也可以进入管理员的页面,没有权限限制。

3、seesion失效时,刷新会错误。

4、防止用户从其他网站url直接连接进入我网站的某个资源,或者某些页面要求必须从某个页面传递进来,直接输入url进入可能会缺少数据而报错等。此时,可以查看请求的上个页面url来判断,语句如下:httpRequest.getHeader("referer")

 

解决方法就是配置附过滤器对请求进行过滤:

相应的解决方法为:

1、第一点和第三点、第四点的解决方法:

  配置用户登录过滤器,即检查session中有没有用户存在,若存在,则进入,没有存在,则跳转。实现如下:



/* 
    
  * To change this license header, choose License Headers in Project Properties. 
    
  * To change this template file, choose Tools | Templates 
    
  * and open the template in the editor. 
    
  */ 
    
 package com.manager.web.filter; 
    
  
import java.io.IOException;
 import java.io.PrintStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 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.annotation.WebFilter;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;/**
  *
  * @author wang
  */
 @WebFilter(filterName = "loginFilter", urlPatterns = {"*.do"})
 public class LoginFilter implements Filter {    private final static String[] exit_url = {"/login/index.do", "/login/logOff.do"}; // 不用做权限判断的URL  
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 //      1、转化成http的请求和响应
         HttpServletRequest httpRequest = (HttpServletRequest) request;
         HttpServletResponse httpResponse = (HttpServletResponse) response;
         String url = httpRequest.getRequestURI();
         System.out.println(url + ":do login Filer!");//      2、取得session
         HttpSession session = httpRequest.getSession();//      3、先过滤掉一些不用登录也可以访问的页面
         boolean isExit = false;
         for (String u : exit_url) {
             if (url.indexOf(u) >= 0) {
 //                System.out.println(url + "---" + url.indexOf(u));
                 isExit = true;
                 break;
             }
         }//      4、/login/verify.do这个请求比较特殊,为了安全,应该屏蔽没有登录的用户请求进入,
 //         但是由于发出该请求时用户肯定是空的,没法使用下面的方法屏蔽,需要使用另外一种方法
 //         即判断发出该请求的上个请求uri是来自与登录页面的uri,就允许请求,否则拒绝,转到index。
 //        下面判断url是对verify的请求,且上个页面不是/login/index.do,便转发到登录页面
         if (url.contains("/login/verify.do")) {
             //上个页面来自登录页面
             if (httpRequest.getHeader("referer") != null && httpRequest.getHeader("referer").contains("/login/index.do")) {
                 isExit = true;
             } else {//不是来自登录页面,拒绝这个请求
                 httpResponse.sendRedirect("/managerSystem/login/index.do");
                 return;
             }
         }//      4、判断session中有没有user这个属性,如果有这表明已经登录;若无,则表明还没登录,应该重定向到登录页面
         if (!isExit && session.getAttribute("user") == null) {
 //            System.out.println(url + "Yes!");
             httpResponse.sendRedirect("/managerSystem/login/index.do");
             return;//必须加,不然会继续往后执行
         }        chain.doFilter(request, response);
     }    public void destroy() {
     }    /**
      * Init method for this filter
      */
     public void init(FilterConfig filterConfig) {
     }}

2、第二点的解决方法:

  配置权限管理过滤器

 

 



/*
  * To change this license header, choose License Headers in Project Properties.
  * To change this template file, choose Tools | Templates
  * and open the template in the editor.
  */
 package com.manager.web.filter;import com.manager.web.entity.User;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 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.annotation.WebFilter;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;/**
  *
  * @author wang
  */
 @WebFilter(filterName = "permitFilter", urlPatterns = {"*.do"})
 public class PermitFilter implements Filter {
     // 不用做权限判断的URL 
     private final static String[] user_canot_access_url = 
     {"login/adminHomePage.do", "signature/adminUserSignature.do","user/adminUserManager.do"};      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 //      1、转化成http的请求和响应
         HttpServletRequest httpRequest = (HttpServletRequest) request;
         HttpServletResponse httpResponse = (HttpServletResponse) response;
         String uri = httpRequest.getRequestURI();
         System.out.println(uri + ":do permit Filer!");//        2、取得session中的user,判断他的用户类型(user或者admin),限制user对管理员页面的访问
         HttpSession session = httpRequest.getSession();
         User user = (User) session.getAttribute("user");
         
 //        3、//判断用户登录且用户类型是user
         if (user != null && user.getUser_type().equals("user")) {
             for(String u:user_canot_access_url){
                 if(uri.endsWith(u)){
                     httpResponse.sendRedirect("/managerSystem/login/index.do");
                     return;
                 }
             }           
         }        chain.doFilter(request, response);
     }    public void destroy() {
     }    /**
      * Init method for this filter
      */
     public void init(FilterConfig filterConfig) {
     }}