您的位置:首页 > Web前端 > JavaScript

[JSP&JDBC]JDBC+Servlet+过滤器访问登陆实例/servlet之filter过滤器

2017-12-29 12:03 549 查看




》》实现的方法

创建一个类去实现servlet里的fiter接口,重写这三个方法

package com.yiki.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;

public class loginFilter implements Filter {

public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain)
throws IOException, ServletException {
/*
* 完成过滤器实际操作
* FilterChain参数调用chain.doFilter方法,将请求传给下一个过滤器,或利用转发,重定向将请求转发到其他资源
*/

}

public void destroy() {
/*
* 释放资源
*/

}

public void init(FilterConfig arg0) throws ServletException {
/*
* 该方法可以读取web.xml里过滤器的参数(<init-param><param-name>参数<param-name></init-param>)
*/

}

}
web.xml示例

/*过滤后发现请求这个项目的所有资源都无法进入了……(放行: chain.doFilter(request, response);     )

<filter>
<filter-name>myFilters</filter-name>
<filter-class>com.yiki.filter.loginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilters</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


》》过滤器链

映射地址相等的两个过滤器会变成过滤器链,服务器会根据web.xml的过滤器定义顺序依次执行,但是是回圈型,第二个filter完成后会回到第一个filter

》》dispatchers关键字:





》》实例

查看本次实例测试项目地址

效果图:只有登陆才能查看功能页











实例结构







思路解释:

首先知道要过滤的东西,就是webroot下的JSP功能页面,从第二个包filter开始,定义一个过滤器,这个过滤器是处理页面的JSP以及过滤mySerlet(处理查询数据库)和findServlet(分页用),而loginServlet则是处理匹配用户登录的,切不可加入过滤器的过滤规则。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name>

<filter>
<filter-name>myFilters</filter-name>
<filter-class>com.yiki.filter.loginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilters</filter-name>
<url-pattern>/JSP/*</url-pattern>
<servlet-name>myServlet</servlet-name>
<servlet-name>findServler</servlet-name>
</filter-mapping>

<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>

<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.yiki.Servlet.myServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>findServler</servlet-name>
<servlet-class>com.yiki.Servlet.findServler</servlet-class>
</servlet>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>loginServlet</servlet-name>
<servlet-class>com.yiki.Servlet.loginServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/servlet/myServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>findServler</servlet-name>
<url-pattern>/servlet/findServler</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/servlet/loginServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


如果已经登陆后应该这样请求路径而不是写包路径

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"
contentType="text/html; charset=gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

<body>
<table align="center">
<tr>
<td>欢迎您,<%=session.getAttribute("username")%></td>
<td><a href="loginServlet?action=out">退出</a></td>
</tr>
</table>
<h1 align="center">Welcome</h1>

<table align="center">
<tr>
<td><a href="myServlet?action=look">查看总表</a></td>
<td><a href="loginServlet?action=delete&success=yes">删除数据</a></td>
<td><a href="loginServlet?action=insertdata&success=yes">插入数据</a></td>
<td><a href="loginServlet?action=update&success=yes">更新数据</a></td>
<td><a href="loginServlet?action=querdata&success=yes">查询数据</a></td>
<td><a href="findServler">分页显示</a></td>
</table>
</body>
</html>
而还没登陆的页面是:(但是是无论如何都访问不了的)

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"
contentType="text/html; charset=gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

<body>
<table align="center">
<tr>
<td><a href="login.jsp">登陆</a></td>
<td><a href="signup.jsp">注册</a></td>
</tr>
</table>
<h1 align="center">请先登录</h1>

<table align="center">
<tr>
<td><a href="servlet/myServlet?action=look">查看总表</a></td>
<td><a href="JSP/delete.jsp">删除数据</a></td>
<td><a href="JSP/insert.jsp">插入数据</a></td>
<td><a href="JSP/update.jsp">更新数据</a></td>
<td><a href="JSP/querbyform.jsp">查询数据</a></td>
<td><a href="servlet/findServler">分页显示</a></td>
</table>
</body>
</html>


处理登陆匹配的servlet

package com.yiki.Servlet;

import java.io.IOException;
import java.net.HttpCookie;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.yiki.dbutil.Student;
import com.yiki.dbutil.StudentImpl;
import com.yiki.loginUti
c7cd
l.User;
import com.yiki.loginUtil.UserImpl;

public class loginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

private String action;
UserImpl dao = new UserImpl();
User user = new User();
ArrayList<User> list = new ArrayList<User>();

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("gb2312");
action = request.getParameter("action");

if (action != null) {
this.action = request.getParameter("action");

if (action.equals("insert")) {// 注册

try {
String name = request.getParameter("username");
byte[] n = name.getBytes("ISO-8859-1");
int password = Integer.parseInt(request.getParameter("password"));

user.setUsername(name);
user.setPassword(password);
dao.add(user);
request.getRequestDispatcher("/success.jsp").forward(request, response);

} catch (Exception e) {
e.printStackTrace();
}

}

else if (action.equals("login")) {//登录

String username = request.getParameter("username");
int password = Integer.parseInt(request.getParameter("password"));

HttpSession session = request.getSession();
session.setAttribute("username", username);

try {
List<User> list = dao.query();//匹配
for (int i = 0; i < list.size(); i++) {
User u = (User) list.get(i);

if (username.equals(u.getUsername()) && password == u.getPassword()) {
Cookie cookie = new Cookie("success", "yes");//如果成功就创建cookie记录
response.addCookie(cookie);

request.getRequestDispatcher("/JSP/welcom.jsp").forward(request, response);
return;
}

}
request.getRequestDispatcher("/error.jsp").forward(request, response);
}

catch (Exception e) {
e.printStackTrace();
}

} else if (action.equals("out")) {退出登录,清除cookie
Cookie cookie = new Cookie("success", null);
cookie.setMaxAge(0);
response.addCookie(cookie);
response.sendRedirect("../index.jsp");

} else if (action.equals("back")) {//返回,因为直接访问包下的文件会被过滤器拦截,why???????
String success = request.getParameter("success");
if (success.equals("yes")) {
request.getRequestDispatcher("/JSP/welcom.jsp").forward(request, response);
return;
}
request.getRequestDispatcher("/error.jsp").forward(request, response);

} else if (action.equals("update")) {//跳转到更新页面
String success = request.getParameter("success");
if (success.equals("yes")) {
request.getRequestDispatcher("/JSP/update.jsp").forward(request, response);
return;
}
request.getRequestDispatcher("/error.jsp").forward(request, response);

} else if (action.equals("delete")) {//跳转到删除页面
String success = request.getParameter("success");
if (success.equals("yes")) {
request.getRequestDispatcher("/JSP/delete.jsp").forward(request, response);
return;
}
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
else if (action.equals("insertdata")) {//跳转到插入数据页面
String success = request.getParameter("success");
if (success.equals("yes")) {
request.getRequestDispatcher("/JSP/insert.jsp").forward(request, response);
return;
}
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
else if (action.equals("querdata")) {//跳转到查询页面
String success = request.getParameter("success");
if (success.equals("yes")) {
request.getRequestDispatcher("/JSP/querbyform.jsp").forward(request, response);
return;
}
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}

}
}


过滤器

package com.yiki.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.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class loginFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
/*
* 完成过滤器实际操作
* FilterChain参数调用chain.doFilter方法,将请求传给下一个过滤器,或利用转发,重定向将请求转发到其他资源
*/

HttpServletRequest rqs = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;

String yes;
Cookie[] cookies = rqs.getCookies();
for (int i = 0; cookies != null && i < cookies.length; i++) {
Cookie cook = cookies[i];
if (cook.getName().equals("success")) { // 获取键
yes = cook.getValue().toString(); // 获取值
System.out.println(yes);
if (yes.equals("yes")) {

chain.doFilter(request, response);
return;
}

}
}
request.getRequestDispatcher("/error.jsp").forward(request, response);

}

public void destroy() {
/*
* 释放资源
*/

}

public void init(FilterConfig arg0) throws ServletException {
/*
* 该方法可以读取web.xml里过滤器的参数
*/

}

}
如果登陆成功的JSP

<%@page import="com.yiki.dbutil.*"%>
<%@ page language="java" import="java.util.*,java.sql.*"
pageEncoding="gb2312"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

<body>
<center>
<h1>操作成功</h1>
<a href="myServlet?action=look">查看</a>
<a href="loginServlet?action=back&success=yes">返回</a>
</center>

</body>
</html>


其他页面具体参考之前的实例,按需要修改路径即可

问题:为什么内部跳转就可以访问被过滤的页面,而在外部访问无论如何都无法访问被匹配。这块还是很迷emmmmm.........
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jsp filter java
相关文章推荐