在做一个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) {
}
}