Filter简介
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Filter应用案例
在本案例中,过滤器重要是为了防止用户在未登录的状态下直接访问主页。
需要用到的类:
- LoginServlet(实现登录功能)
在这里插入代码片public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取用户输入的userName
String username = req.getParameter("userName");
if (username.equals("admin")){//如果登录成功
//将登录信息存储至session中
req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
//重定向至主页
resp.sendRedirect("/sys/homepage.jsp");
}
else {//如果登录失败
//重定向至失败页面
resp.sendRedirect("/default.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- LogoutServlet(实现注销功能)
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//判断是否登录
if(req.getSession().getAttribute("USER_SESSION") != null){
//如果是登陆状态则抹除session中的USER_SESSION数据
req.getSession().removeAttribute("USER_SESSION");
//重定向回登陆界面
resp.sendRedirect("/login.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- FilterDemo(实现过滤功能)
public class FilterDemo02 implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse) resp;
//判断USER_SESSION值是否为空
if (request.getSession().getAttribute("USER_SESSION") == null ){
//如果检测到用户未登录直接进入主页则转至错误界面
response.sendRedirect("/error.jsp");
}
//固定写法且必写
filterChain.doFilter(req,resp);
}
public void destroy() {
}
}
需要用到的JSP界面
- login.jsp(登录界面)
<body>
<h1>登录</h1>
<hr>
<form action="/servlet/login" method="get">
<input type="text" name="userName"><br>
<input type="submit" value="登陆">
</form>
</body>
- homepage.jsp(登录成功进入的主页)
<body>
<h1>欢迎来到主页!</h1><br>
<a href="/servlet/logout">注销</a>
</body>
- default.jsp(登录失败界面)
<body>
<h1>Error:用户名错误或没有访问权限!</h1>
</body>
- error.jsp(当用户直接访问主页时的错误界面)
<body>
<h1>请先登录再访问!</h1><br>
<a href="/login.jsp">点击此处返回登录界面</a>
</body>
web.xml配置
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.teng.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/servlet/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>com.teng.servlet.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/servlet/logout</url-pattern>
</servlet-mapping>
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.teng.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<!--因为homepage.jsp放在sys文件下,所以过滤器需要过绿的是sys下的文件-->
<url-pattern>/sys/*</url-pattern>
</filter-mapping>
本案例中使用到的maven依赖
<!-- Servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- JSP依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<!-- jspl依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.2</version>
</dependency>
<!-- standard标签库-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
运行图
登录:
如果登陆成功:
如果登录失败:
如果用户未登录直接访问主页:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/147373.html