首先我们应该明白java过滤器的作用原理,他到底是干什么的?什么原理?
顾名思义,过滤器即起到过滤的作用。大家可以把它根过滤网联想一下。这是我画的过滤器示意图:
1 过滤器对用户的‘请求’和服务器的‘响应’做了一层过滤,即进行了预处理。
(1)当用户在客户端向服务器发出请求时,首先在请求进入服务器之前要经过过滤器Filter的处理(修改请求信息—包括请求的头信息、数据、url地址等信息);
(2)当服务器接收到用户的请求之后,会响应客户端反馈信息回去,同样在服务器发送响应信息到客户端之前,过滤器也会进行相应的过滤处理;
2 写一个java过滤器,必须要实现javax.servlet.Filter接口。
过滤重启定义了3个必须实现的方法:
(1)public void init(FilterConfig config) throwsServletException {}
(2)public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain) throws IOException,ServletException{}
(3)public void destroy(){}
方法 (1) 用来初始化过滤器配置信息;
方法 (2) 进行相应的过滤处理;
方法 (3) 在取消执行之前进行过滤资源释放。
3下面我们来实现一个用户通过浏览器访问资源的过滤器,要求:
(1)如果用户未登录则跳转至登录页面,登陆之后跳转到原来输入地址对应的页面;
(2)如果用户已登录则直接进入输入的地址对应的页面;
(3)实现原理:
主要是对于未登录用户的处理,在跳转至登录页面之前将用户原来的访问的地址截取项目名称后面的部分,然后作为一个参数写入session中保存;
当用户登录时,将session中保存的地址取出进行跳转。
4代码实现与配置:
(1)过滤器代码
package adam.bp.workflow.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;
/**
* @author hsy
*
*/
public class LoginFilter implements Filter {
private static final String SHOW_LOGIN_PATH = "SHOW_LOGIN_PATH"; //显示登录页面
private static final String DO_LOGIN_PATH = "DO_LOGIN_PATH"; //登录操作不能过滤掉
private static final String LOGIN_PERSONID = "LOGIN_PERSONID"; //登录用户在session中的属性key -- session.setAttribute(key,value)
private String showloginPath;
private String dologinPath;
private String loginPersonId;
public void init(FilterConfig config) throws ServletException {
showloginPath = config.getInitParameter(SHOW_LOGIN_PATH);
dologinPath = config.getInitParameter(DO_LOGIN_PATH);
loginPersonId = config.getInitParameter(LOGIN_PERSONID);
if(showloginPath==null || showloginPath.equals("") || showloginPath.equals("null") ){
throw new ServletException("登录页面配置出错...");
}
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpReq = (HttpServletRequest) request;
HttpServletResponse httpResp = (HttpServletResponse) response;
httpResp.setContentType("text/html");
//判断是否是登陆页面
String servletPath = httpReq.getServletPath();
//flag:若为登陆页面的action路径 showloginPath/nologinPath,则赋值true,否则赋值false
boolean flag = false;
if(servletPath.equals(showloginPath) || servletPath.equals(dologinPath)){
chain.doFilter(request, response);
flag = true;
return;
}
else
{ //如果不是登录页面,则需先判断用户是否已登录
//String url = servletPath;
Object loginId = httpReq.getSession().getAttribute(loginPersonId);
if(loginId != null){//如果不为空,则进行已登录处理
chain.doFilter(request, response);
}else{//如果为空,则进行未登录处理
if ( httpReq.getQueryString() != null )
{
servletPath += "?"+httpReq.getQueryString();
}
httpReq.getSession().setAttribute("returnUri", servletPath);
if ( flag == false )
{
httpReq.getRequestDispatcher(showloginPath).forward(httpReq,httpResp);
}
}
}
}
public void destroy(){
//do something
}
}
(2)web.xml中的配置
<!-- 用户登录过滤 -->
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>adam.bp.workflow.filter.LoginFilter</filter-class>
<init-param>
<param-name>LOGIN_PERSONID</param-name>
<param-value>loginPersonId</param-value>
</init-param>
<init-param>
<param-name>SHOW_LOGIN_PATH</param-name>
<param-value>/showLogin.do</param-value>
</init-param>
<init-param>
<param-name>DO_LOGIN_PATH</param-name>
<param-value>/doLogin.do</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
(3)
相应的页面登录的servlet或者action代码,就不写了,相信对大家来说这个不难!
分享到:
相关推荐
本项目涉及的核心知识点主要涵盖自动登录、防止未登录直接访问以及角色基础的权限控制(RBAC)。以下将详细解析这些概念及其在Java Servlet环境下的实现。 一、自动登录 自动登录,通常称为“记住我”功能,是为了...
在标题"利用Filter拦截用户登录"中,核心任务是阻止未登录用户访问受保护的页面。当用户尝试访问需要登录的URL时,Filter会检查其是否已登录。如果没有,Filter可以重定向他们到登录页面。 以下是实现这个功能的...
在本例中,要实现一个简单的登录验证过滤器,可以阻止未登录用户访问除了登录页面以外的其他后台管理页面。通过实现javax.servlet.Filter接口,我们创建了一个LoginFilter类。这个过滤器会在每个请求到达目标页面...
【Filter控制页面的访问权限】是指在Web应用中,通过Filter(过滤器)技术来实现对用户访问特定页面的权限管理。Filter是Java Servlet API的一部分,它可以拦截HTTP请求,在请求到达目标Servlet或JSP之前进行预处理...
3. **权限判断**:在`Filter`中,可以进一步检查请求的资源是否允许当前用户访问。这可以通过比较用户角色、权限码或其他业务规则来完成。 4. **拦截非授权访问**:如果用户尝试访问未授权的资源,`Filter`应拦截...
### 用户登录过滤与URL越权访问控制 #### 一、概述 在现代Web应用程序中,安全性和用户体验至关重要。为了确保用户数据的安全以及提供一个良好的用户体验环境,开发人员常常需要实现一系列的安全措施。其中,...
本文将详细介绍一个简单的Java登录拦截器实现,它能够检查用户是否已经登录,并阻止未登录用户访问某些页面。 #### 二、登录拦截器概述 登录拦截器是一种基于Java Servlet API的机制,用于在请求到达目标资源之前...
在这个场景中,"Filter进行权限控制"指的是使用`Filter`来实现用户访问权限的管理,确保只有登录后的用户才能访问特定的资源。下面我们将深入探讨`Filter`的工作原理以及如何实现登录控制。 `Filter`是Java Servlet...
// 如果用户未登录,重定向到登录页面 ((HttpServletResponse) response).sendRedirect("/login.html"); } else { // 用户已登录,继续请求链 chain.doFilter(request, response); } } @Override public ...
本文将详细探讨如何通过`Filter`实现权限控制,以及与RBAC(Role-Based Access Control,基于角色的访问控制)的关系。首先,让我们理解`Filter`的概念。 `Filter`是Java Servlet API中的一个重要组件,它允许我们...
如果用户未登录,Filter可以重定向他们到登录页面;如果已登录,Filter则允许请求继续。 **EL(Expression Language)** 是一种轻量级的脚本语言,常用于JSP中,用于简化数据访问和操作。在权限控制中,EL可以帮助...
4. 处理未登录用户:对于未登录的用户,我们可以将其重定向到登录页面,或者返回错误提示。 四、优化与扩展 为了提高效率和可维护性,我们可以将权限检查逻辑封装到单独的服务或工具类中,使得Filter更专注于过滤...
通过Filter控制客户端IP访问是一种常见的安全措施。以下是一个简单的示例,展示了如何创建一个只允许特定IP访问的Filter: ```java public class IpFilter implements Filter { private String rejectedIP; ...
访问控制是为了限制用户对资源的访问权限,以免未经授权的用户访问敏感资源。 需求分析 在本文中,我们将创建一个简单的 Web 应用程序,实现身份认证和访问控制。我们的需求是: 1. 根目录下的资源允许匿名访问。...
例如,我们可以添加角色检查,只允许具有特定角色的用户访问某些资源。这可以通过在会话中存储用户的角色信息,并在过滤器中进行比较来完成: ```java private boolean hasRole(HttpServletRequest request, String...
如果用户未登录,Filter可以直接返回错误页面或者重定向到登录页面。 三、实现过滤非登录用户的源码实例 以下是一个简单的Java Filter实现示例,用于检查请求中的session中是否存在登录用户的信息: ```java ...
总之,通过使用Servlet Filter技术,我们可以对未登录用户的JSP页面访问进行有效控制,避免了非法用户绕过登录页面直接访问系统其他页面的风险。这种做法不仅增强了系统的安全性,也提升了用户体验,因为它确保了...
这种配置常用于企业网络,以增强内部网络的安全性,允许内部用户访问外部资源,但防止外部网络对内部网络的直接访问。 首先,让我们了解网络的简易拓扑结构:内部网络PC通过RouterA的E0接口与外部网络RouterB的S1...
在登录验证的场景下,Filter的主要任务是在用户访问受保护的页面之前检查用户是否已经登录。如果用户未登录,我们可以重定向他们到登录页面;反之,如果用户已登录,允许他们访问受保护的资源。 以下是一个简单的...
在Java Web开发中,MVC(Model-View-Controller)模式是一种常见的架构设计,用于分离应用程序的业务逻辑、用户界面和数据访问。Struts2框架是实现MVC模式的一个流行选择,它提供了一种优雅的方式来组织和管理应用...