Java中应用Filter对权限和Session控制

用Filter防止用户访问一些未被授权的资源,比如一个用户未登录就不允许访问网站的某些页面,并将页面重定向到需要用户登录的页面,下面是一个相关的例子:

package com.drp.util.filter;
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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class AuthFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
/** 1,doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括
*  表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过
*  滤器中忽略此参数。最后一个参数为FilterChain,此参数用来调用servlet或JSP页。
*/
HttpServletRequest request = (HttpServletRequest)servletRequest;
/** 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中
*  无法得到的方法,就要把此request对象构造成HttpServletRequest
*/
HttpServletResponse response = (HttpServletResponse)servletResponse;
String currentURL = request.getRequestURI(); //取得根目录所对应的绝对路径:
String targetURL = currentURL.substring(currentURL.indexOf("/", 1),
currentURL.length()); //截取到当前文件名用于比较
HttpSession session = request.getSession(false);
if (!"/login.jsp".equals(targetURL)) {
//判断当前页是否是重定向以后的登录页面页面,如果是就不做session的判断,防止出现死循环
if (session == null || session.getAttribute("user") == null) {
//*用户登录以后需手动添加session
System.out.println("request.getContextPath()=" + request.getContextPath());
response.sendRedirect(request.getContextPath() + "/login.jsp");
//如果session为空表示用户没有登录就重定向到login.jsp页面
return;
}
}
//加入filter链继续向下执行
filterChain.doFilter(request, response);
/** 调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作
*  为它 的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另
*  一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。
*/
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}

然后在配置文件web.xml里添加: (请注意,过滤是在serlvet规范2.3版中初次引入的。因此,web.xml文件必须使用DTD的2.3以上版本。)

<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.drp.util.filter.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>*.jsp</url-pattern>//表示对所有jsp文件有效
</filter-mapping>

这样用户没有登录的情况下就会转到登录页面。

时间: 2024-12-22 01:36:29

Java中应用Filter对权限和Session控制的相关文章

Java中的Filter过滤器详解

Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 它主要用于对用户请求进行预处理,也可以对HttpServletResponse 进行后处理.使用Filter 的完整流程:Filter 对用户请求进行预处理,接着将

java 中怎样实现这个权限问题?

问题描述 1.登录界面选择管理员身份,在主界面可以实现删除学生管理员功能但是,如果是学生管理员身份登陆系统,则不能实现删除学生管理员功能2.如果以管理员登录,管理员可以"看见"删除管理员的这个功能按钮如果是学生管理员登录,就"看不到"删除管理员这个功能按钮3.连接数据库请问各位大虾们,这个功能怎么实现?急...... 解决方案 解决方案二:1.登陆后会话信息(比如"aaaaaaa")保存到session中在jsp页面上从session中取出来会话

java中使用Filter控制用户登录权限具体实例_java

学jsp这么长时间,做的项目也有七八个了,可所有的项目都是用户登录就直接跳转到其拥有权限的页面,或者显示可访问页面的链接.使用这种方式来幼稚地控制访问权限.从来没有想过如果我没有登录,直接输入地址也可以直接访问用户的页面的. 在jsp中权限的控制是通过Filter过滤器来实现的,所有的开发框架中都集成有Filter,如果不适用开发框架则有如下实现方法: LoginFilter.java 复制代码 代码如下: public class LoginFilter implements Filter {

java中怎么设置文件权限

检查文件权限允许: 1.file.canExecute(); – 返回true,文件是可执行的,false 则不是. 2.file.canWrite(); – 返回true,文件是可写的,false 则不是. 3.file.canRead(); – 返回true,文件是可读的,false 则不是. 设置文件权限: 1.file.setExecutable(boolean); – true允许执行操作; false则是禁止它. 2.file.setReadable(boolean); – true

谈谈Java中protected访问权限

来谈谈protected访问权限问题.看下面示例1: Test.java class MyObject {} public class Test { public static void main(String[] args) { MyObject obj = new MyObject(); obj.clone(); // Compile error. } } 此时出现上文提到的错误:The method clone from the type Object is not visiuable.

封装-java中 关于成员变量public权限的意义

问题描述 java中 关于成员变量public权限的意义 类为了封装 应该都已经讲成员变量设为private权限了 那public的意义是什么 好像看过一本c++的书 说语言发明者仅仅是为了操作简单 但是一直比较纠结 问问各位大神 解决方案 field只是不建议public,如果要public,请用方法或者属性,如果是const或者readonly的你可以考虑public出来,因为这些是不可变的

关于java中Session的过期问题

问题描述 1.判断一个session是否为空:if(session==null){}这样算不算使用了session?这样问可能不是很清楚,那么详细些.session都有过期时间吧,那么应该是在session被创建的时候就有一个计时器,这个时间达到过期时间的话就销毁这个session如果用这句if(session==null)会不会重置这个计时器?2.可不可以在session过期的时候执行一段代码,即像filter的destroy方法一样?请大家帮帮忙,谢谢,如果上述有什么不对之处,请赐教. 解决

java 项目中的链接共用此项目的session。怎么实现

问题描述 java 项目中的链接共用此项目的session.怎么实现 java 项目中插入了很多小型的项目链接,但是都需要登录一遍.对使用者来说很不人性化,我需要怎么做才能只登录一次打开其他链接自动获取当前项目的session 解决方案 利用认证服务器来统一认证 解决方案二: 就是需要进行单点登录嘛,使用Spring security + CAS可以轻松解决 解决方案三: 用 session共享 用memcached和apache服务器就可以实现 session共享了

java中如何进行权限管理,不同用户在界面显示的功能也不同。

问题描述 java中如何进行权限管理,不同用户在界面显示的功能也不同. 每个用户的权限不同,超级管理员可以将权限赋予给用户,用户不能操作不具有权限的功能,求大神帮忙 解决方案 一般都会使用一些权限模型的,比如RBAC模型,对于数据库可以设计5张表,分别是用户表,角色表,许可表,用户角色关系表,角色许可关系表 解决方案二: 始终离不开,权限.角色.资源 解决方案三: rbac可以解决你的需求