浏览器行为的三要素
开发人员负责控制浏览器请求行为[三要素]
1.请求地址控制<a></a> <form> </form>
2.请求方式控制: POST/GET
3.请求参数控制: <a></a> /login?usename=xiaoqiu&pwd=123
表单域标签[input ,select,textarea]
浏览器向服务器发起请求的方式
<form actiom="/地址" method="get(post)"></form>
<a href=""></a> a标签默认的请求方式是get
post和get两种请求方式的区别
编码的方式不一样
req.setCharacterEncoding("UTF-8");
web项目的部署
Myweb(项目名)
-css
-html
-js
-WEB-INF
--classes
--lib
--web.xml
继承HtppServlet类
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet类主要针对浏览器发送Get启动的做处理");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet类主要针对浏览器发送Post启动的做处理");
}
}
Servlet对象的生命周期
1.网站中所有的Servlet接口实现类的实例对象,只能由ttp服务器负责额创建。
开发人员不能手动创建servlet接口实现类的实例对象
2.在默认的情况下,Http服 务器接收到对于当前servlet接口实现类第一次请求时自动创建这个servlet接口实现类的实例对象
在手动配置情况下,要求Http服务器在启动时自动创建某个servlet接口实现类的实例对象
下面是启动时自动创建Servlet对象的方法
<servlet>
<servlet-name></servlet- name> <!--声明-一个变量存储servlet接口实现类类
<servlet- class>类名</ servlet-class>
<load-on-startup>30<load-on-startup><!--填写-一个大于0的整数即可-->
</servlet>
3.在Http服务器运行期间,一个servlet接口实现类只能被创建出一个实例对象
4.在http服务器关闭时刻,自动将网站中所有的servlet对象进行销毁
每一个Servlet只能有一个实例对象,在被访问时创建且只创建一次,服务器关闭时销毁
<load-on-startup>30<load-on-startup><!--填写-一个大于0的整数即可-->
在web.xml文件添加该标签,则在打开时自动创建
关于HttpServletResponse
Http响应包
通常通过response的getWriter方法来获得输出流对象
通过输出流对象的print方法来将内容输出到浏览器上
PrintWriter writer = response.getWriter();
响应对象响应头的ContentType类型进行更改
response.setContentType("text/html;charset=UTF-8");设置浏览器的解析方式,还有使用的字符集
response.sendRedirect("http://www.baidu.com");//给响应头的location赋值,当访问时,响应头中有location的属性则跳转至其位置(重定向)
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
测试response的一些方法
response.setContentType("text/html;charset=UTF-8");设置字符集解析方式
response.sendRedirect("http://www.baidu.com");给响应头的location赋值,当访问时,响应头中有location的属性则跳转至其位置
*/
@WebServlet(name = "ThreeServlet")
public class ThreeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用html文本编译器
//response.setContentType("text/html;charset=UTF-8");
response.sendRedirect("http://www.baidu.com");//给响应头的location赋值,当访问时,响应头中有location的属性则跳转至其位置
PrintWriter writer = response.getWriter();
writer.print("java<br/>Html<br/>Css");
}
}
对于响应的应用(JDBC连接数据库)
将数据库中的数据输出到浏览器上
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
public class ListEmpServlet implements Servlet {
public static void main(String[] args) {
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
Connection connection=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/xiaoqiu?useSSL=false","root","");
String sql="select ename,sal from emp where sal>?";
ps=connection.prepareStatement(sql);
ps.setString(1,"300");
rs=ps.executeQuery();
PrintWriter writer = servletResponse.getWriter();
writer.print("<html>");
writer.print("</body>");
writer.print("<table border=\"1px\" width=\"50%\">");
writer.print("<tr>");
writer.print("<th>"+"ename");
writer.print("</th>");
writer.print("<th>"+"sal");
writer.print("</th>");
writer.print("</tr>");
while (rs.next()) {
writer.print("<tr>");
writer.print("<td>"+rs.getString(1)+"</td>");
writer.print("<td>"+rs.getString(2)+"</td>");
writer.print("</tr>");
}
writer.print("</table>");
writer.print("<body>");
writer.print("</html>");
} catch (Exception e) {
e.printStackTrace();
}finally {
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
关于HttpServletRequest
请求协议包:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
/*
*/
public class ThreeServlet extends HttpServlet {
@Override
/*
读取请求头中的参数值
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enumeration paramsNames = request.getParameterNames();//获取获一组参数名,返回的是枚举集合
while (paramsNames.hasMoreElements()){//遍历这个集合
String paramName = (String)paramsNames.nextElement();//调用集合对象得nextElement方法得到下一个,默认是指得是-1的位置
String value = request.getParameter(paramName);//request对象通过参数名获得参数值(有点像Map集合键值对)
System.out.println(paramName+":"+value);
}
}
@Override
/*
读取请求体中的参数值
*/
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Enumeration paramsNames = req.getParameterNames();//
while (paramsNames.hasMoreElements()){
String paramName = (String)paramsNames.nextElement();
String value = req.getParameter(paramName);
System.out.println(paramName+":"+value);
}
}
}
读取结果:
学员管理系统
注:
1.在像一个具有主键约束或者唯一约束的字段的时候,要先判断该字段是否已在数据中出现,然后在进行插入操作
2.在前后端交互的过程中,必须要设置编码格式为UTF-8,如果数据库或者是前端提交的时候可能会出现乱码
用户查询:
package com.ning;
import com.ning.Util.JDBCUtil;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
/*
* 显示数据库中的所有数据
*/
public class User_find extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
PrintWriter writer = response.getWriter();
try {
conn = JDBCUtil.getConnection();;
String sql ="select * from t_user";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
writer.print("<table border=\"1\" align=\"center \">");
writer.print("<tr>");
writer.print("<th>"+"usename"+"</th>");
writer.print("<th>"+"password"+"</th>");
writer.print("<th>"+"sex"+"</th>");
writer.print("<th>"+"email"+"</th>");
writer.print("<th>"+"operate"+"</th>");
writer.print("</tr>");
while(rs.next()){
writer.print("<tr>");
for (int i=2;i<=5;i++){
writer.print("<td>"+rs.getString(i)+"</td>");
}
String usename=rs.getString("usename");
writer.print("<td><a href='/myweb/user/delete?usename="+usename+"'"+">delete</a></td>");
writer.print("</tr>");
// userid = rs.getString("userId");
// usename = rs.getString("usename");
// password = rs.getString("password");
// sex = rs.getString("sex");
// email = rs.getString("email");
}
response.setContentType("text/html;charset=utf-8");
writer.print("</table>");
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.Close(conn,ps,rs);
writer.close();
}
}
}
用户删除:
package com.ning;
import com.ning.Util.JDBCUtil;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class User_delete extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
System.out.println(writer);
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn= JDBCUtil.getConnection();
String sql = "delete from t_user where usename=?";
ps = conn.prepareStatement(sql);
ps.setString(1,request.getParameter("usename"));
int count = ps.executeUpdate();
System.out.println(count);
if (count==1){
writer.print("<h2>删除成功</h2>");
}else {
writer.print("<h2>删除失败</h2>");
}
response.setContentType("text/html;charset=utf-8");
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.Close(conn,ps,rs);
writer.close();
}
}
}
用户注册:
package com.ning;
import com.ning.Util.JDBCUtil;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class User_add extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
//usename=xiaoqiu&password=12131&email=1213&sex=%E7%94%B7
String usename = request.getParameter("usename");
String password = request.getParameter("password");
String email = request.getParameter("email");
String sex = request.getParameter("sex");
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs=null;
PrintWriter writer = response.getWriter();
try {
/*
为了避免设置了用户名唯一报错,应该先查询数据库中有没有usename=?的用户,有的话则像前端返回该用户已存在
数据库中没有这条数据则进行插入操作
*/
conn = JDBCUtil.getConnection();
String sql = "select * from t_user where usename = ?";
ps = conn.prepareStatement(sql);
ps.setString(1,usename);
rs = ps.executeQuery();
if (rs.next()){
writer.print("<h2>用户已存在</h2>");
}else {
ps=null;
String sql1 = "insert into t_user(usename,password,email,sex) values(?,?,?,?)";
ps = conn.prepareStatement(sql1);
ps.setString(1,usename);
ps.setString(2,password);
ps.setString(3,email);
ps.setString(4,sex);
int count = ps.executeUpdate();
if (count == 0){
writer.print("<h2>注册失败</h2>");
}else{
writer.print("<h2>注册成功</h2>");
}
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.Close(conn,ps,rs);
}
}
}
用户登录:
package com.ning;
import com.ning.Util.JDBCUtil;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class User_login extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
String usename = request.getParameter("usename");
String password = request.getParameter("password");
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtil.getConnection();
String sql = "select * from t_user where usename=? and password=?";
ps = conn.prepareStatement(sql);
ps.setString(1,usename);
ps.setString(2,password);
rs = ps.executeQuery();
if (rs.next()){
response.getWriter().print("<h2>登录成功</h2>");
}else{
response.getWriter().print("<h2>登录失败,请重新输入或者注册账号</h2>");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
JDBC工具类:
package com.ning.Util;
import java.sql.*;
public class JDBCUtil {
private JDBCUtil() {
}
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ning?serverTimezone=UTC","root","");
}
public static void Close(Connection conn, Statement ps, ResultSet rs) {
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ps!=null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
关于Http不同的状态码
组成100---599; 分为5个大类
1XX :
最有特征100;通知浏览器本次返回的资源文件
并不是一一个独立的资源文件,需要浏览器在接收
响应包之后,继续向Ettp服务器所要依赖的其他资源文件
2xx:
最有特征200,通知浏览器本次返回的资源文件是一个
完整独立资源文件,浏览器在接收到之.后不需要所要
其他关联文件
3xx:
最有特征302,通知浏览器本次返回的不是一个资源文件内容
而是一一个资源文件地址,需要浏览器根据这个地址自动发起
请求来索要这个资源文件
response. sendRedirect ("资源文件地址")写入到响应头中location
而这个行为导致Tomcat将302状态码写入到状态行
4xx:
404:通知浏览器,由于在服务端没有定位到被访间的资源文件
因此无法提供帮助
405:通知浏览器,在服务端已经定位到被访问的资源文件(serviet)
但是这个servlet对于浏览器采用的请求方式不能处理
5xx:
500:
通知浏览器,在服务端已经定位到被访问的资源文件( servlet )
这个servlet可以接收浏览器采用请求方式,但是servlet在处理
请求期间,由于Java异 常导致处理失败
多个Servlet之间的调用规则
如果要访问多个Servlet,不可能用户每次都去操作,可以采用重定向,以及请求转发这两种方案
重定向解决方案:
1.工作原理:用户第一次通过[手动方式]通知浏览器访问oneservlet.Oneservlet.工作完毕后,将Twoservlet地址写 入到响应头location属性中,
导致Tomcat将302状态码写入到状态行。在浏览器接收到响应包之后,会读取到302状态。
此时浏览器自动根据响应头中location属性地址发起第二次请求,访问TwoServlet去完成请求中剩余任务
2.实现命令;
String address="http://www.baidu.com";
response.sendRedirect(address);
将地址写入到响应包中响应头中location属性
3.特征:
1)请求地址:
既可以把当前网站内部的资源文件地址发送给浏览器(I/网站名/资源文件名)
也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)
2)请求方式:get
3)次数:至少需要两个Http请求协议包
4.缺点:
重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间
中
消耗在往返次数上,增加用户等待服务时间
请求转发方案:
1.工作原理:
用户第一次通过[手动方式]通知浏览器访问oneservlet.Oneservlet.工作完毕后,请求转发转到另一个资源文件
2.实现命令:
request.getRequestDispatcher("/two").forward(request,response);
3.特征:
1)请求次数
在请求转发过程中,浏览器只发送一 次请求
2)请求地址
只能向Tomcat服务器申请调用当前网站下资源文件地址
request . getRequestDispathcer("/资源文件名") | ****不要 写网站名**** |
3)请求方式
在请求转发过程中,浏览器只发送一一个了个Http请求协议包.
参与本次请求的所有servlet共享同一个请求协议包,因此
这些servlet接收的请求方式与浏览器发送的请求方式保持一致
4)优缺点
优点:减少了服务器与浏览器交互的次数效率提高
缺点:增加了服务器的压力
多个Servlet实现数据共享
多个Servlet实现数据共享的方式:
一、ServletContext(全局作用域对象)类似留言板(键值对模式)
工作原理:
每一个网站都存在-一个全局作用域对象。这个全局作用域对象[相当于] -一个Map.在这个网站中oneservlet可以将一-个数据存入到全局作用域对象,当前网站中其他servlet此时都可以从全局作用域对象得到这个数据进行使用
全局作用域对象生命周期:
1)在Http服务器启动过程中,自动为当前网站在内存中创建
一个全局作用域对象
2)在Http服务器运行期间时,--个网站只有一一个全局作用域对象
3)在Http服务器运行期间,全局作用域对象一直处于存活状态
4)在ettp服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁处理
**全局作用域对象生命周期贯穿网站整个运行期间**
3.实现命令
//首先向Tomcat拿到这个全局作用域对象,通过调用serAttribute方法以键值对的形式向里面存放数据
ServletContext application = request.getServletContext();
application.setAttribute("key1","你是一个小傻瓜");
//同样先拿到全局作用域对象,然后调用getAttribute方法通过key来得到value
ServletContext application = request.getServletContext();
Object value = application.getAttribute("key1");
二、Cookie
实现命令:
//新建Cookie对象,key-value且都一定要为字符串
Cookie card1 = new Cookie("usename",usename);
Cookie card2 = new Cookie("money",money);
//把新建的Cookie对象添加到响应体中
response.addCookie(card1);
response.addCookie(card2);
//其他类访问Cookie(第一次访问时,注册会员并且把会员卡返回给用户(浏览器),过了一段时间再次访问时,发起请求时,请求体内携带Cookie数据)
Cookie []cookieArrays = request.getCookies();
//遍历Cookie数组得到每个Cookie的名字和值
for (Cookie card : cookieArrays){
String name = card.getName();
String value = card.getValue();
}
Cookie的生命周期
默认情况下Cookie存储在浏览器的缓存中,浏览器关闭,Cookie自动清楚,也可以将Cookie存储在硬盘中
实现命令
cookie.setMaxAge(60);(设置该Cookie对象的存活时间,参数的单位是秒)
缺点:
一个Cookie对象只能存储一个共享数据,而且数据类型单一(String)
三、HttpSession接口(会话域作用对象)
实现命令
OneServlet{
HttpSession session = request.getSession();
session.setAttribute("goodsname",goodsname);//插入共享数据
}
TwoServlet{
HttpSession session = request.getSession();
String value = (String) session.getAttribute("goodsname");//获得共享数据
}
四、HtppServletRequert接口
请求转发的两个Servlet之间可以通过
OneServlet {
request.setAttribute("goodsname",goodsname);插入数据
request.getRequestDispatcher("/two").forward(request,response); //请求转发
}
TwoServlet{
String value = (String) request.getAttribute("goodsname");
}
监听器
监听器:
功能:主要是监听作用域对象何时创建,何时销毁以及共享数据的变化
作用域对象分为:
全局作用域对象
会话作用域对象
请求作用域对象
实现方法
1.new 一个类 实现监听器接口
2.重写接口实现类的方法
3.将这个类注册到Htpp服务器中
在Tomcat中在一个web工程的web.xml文件中配置如下属性即可
<--!
将类注册到Htpp服务器中
-->
<listener>
<listener-class>com.xiaoqiu.listener.OneListener</listener-class>
</listener>
全局作用域对象的监听器
new 一个类实现 ServletContextListener接口
@Override
public void contextInitialized(ServletContextEvent sce) {//全局作用域被创建时会自动调用该方法输出hello
System.out.println("hello");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {//全局作用域被销毁时会自动调用该方法输出bye
System.out.println("bye");
}
new 一个类实现ServletContextAttributeListener接口
public void attributeAdded(ServletContextAttributeEvent scae) {//增加新元素时
System.out.println("添加----");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {//移除一个元素时
System.out.println("移除----");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {//更新一个元素时
System.out.println("更新---");
}
通过监听器提升程序的运行速度
一般连接数据库的时候创建connection对象和销毁connection对象比较消耗时候
采用在全局域监听器,在网站启动的时候创建多个Connection对象,用Map来存储,Map(该对象的存储位置,true/false)是否为可用状态
过滤器
Filter(过滤器)接口
作用:
1)拦截Http服务器,帮助8ttp服务器检测当前请求合法性
2)拦截Ettp服务器,对当前请求进行增强操作
Filter接口实现类开发步骤:三步
1)创建-一个Java类实现rilter接口
2)重写Filter接口中doFilter方法
3)web.xml将过滤器接口实现类注册到http服务器
web.xml
<filter>
<filter-name>OneFilter</filter-name>
<filter-class>com.xiaoqiu.OneFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OneFilter</filter-name>
<url-pattern>/mm.png</url-pattern>
</filter-mapping>
Filter接口的实现类:
package com.ning;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class OneFilter implements javax.servlet.Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
String age = servletRequest.getParameter("age");
if (Integer.parseInt(age)<70){
filterChain.doFilter(servletRequest,servletResponse);//放行
}else {
//进行拦截
servletResponse.setContentType("text/html;charset=utf-8");
PrintWriter writer = servletResponse.getWriter();
writer.print("<h1>你不行</h1>");
}
}
}
过滤器的地址栏
<url-pattern></url-pattern>
3)要求Tomcat在调用某-一个具体文件之.前, 来调用oneFilter拦截
<url-pattern>/ img/ mm. jpg</url -pattern>
4)要求Tomcat在调用某一一个 文件夹下所有的资源文件之前,来调用oneFilter拦截
<url -pattern>/ img/* </url -pattern>
5)要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截
<url-pattern>* . jpg</url -pattern>
6)要求Tomcat在调用网站中任意文件时,来调用oneFilter拦截
<url -pattern>/*</url -pattern>
防止恶意登录
恶意登录指的是用户绕过登录界面直接进入其他页面如(index.html)
在登录界面的时候登录成功
HttpSession session = request.getSession();(创建一个柜子)
再进行其他操作时HttpSession session = request.getSession(false);看柜子是否是空的null如果是空的则不进行服务
(这个方法不能对静态文件进行保护,而且开发难度大每一个动态文件都需要先确认是否合法)
通过过滤器进行防止恶意登录
登录成功时HttpSession session = request.getSession();(创建一个柜子)这样会出现一个问题谁都无法正常访问了
需要对地址栏的url进行一个分开处理,如果是与login相关的请求则调用dofilter方法放行(欢迎资源文件的时候也需要,默认是login.html)
否则拒绝访问