URL安全问题(过滤器)

来源:互联网 发布:淘宝卖家投诉电话 编辑:程序博客网 时间:2024/06/06 17:19

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

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

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

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

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

 

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

相应的解决方法为:

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) {
    }

}

0 0