您的位置:首页 > 其它

URL安全问题(过滤器)

2014-04-10 13:18 176 查看
在做一个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) {

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: