Filter
Filter:过滤器,用来过滤网站的数据;
- 处理中文乱码1
- 登录验证…
- 过滤 敏感词
项目初始化
-
新建 Maven项目,idea打开后,选择项目最外层,选择 添加框架支持——web应用程序 版本4.0,创建web.xml
- 这种测试不行,所有配置,找不到 对应的 servlet 和 filter
-
新建 Java Enterprise,
- 模板为 Web 应用程序
- 应用程序服务器为 tomcat 9.0.24
- 项目导入了如下包,可以使用注解
- 下一步 选择时 添加上 servlet
-
目录结构为:src/main
- 下有 webapp 注意不加s
- java.com.xxx
-
文件——项目结构——项目设置
- 项目——项目编译输出——demo3\out
- 模块 demo3
- deom3 的 根目录 选到 demo3
- 源文件夹:src\main\java
- 测试文件夹:src\test\java
- 资源文件夹:src\main\resources
- 测试资源文件夹 src\test\resouces
- 排除的文件夹:target
- 路径,使用模块编译输出路径
- \demo3\target\classes
- \demo3\target\test-classes
- 依赖全部都有
- Web
- Web部署描述符 \demo3\src\main\webapp\WEB-INF\web.xml
- Web资源目录 \demo3\src\main\webapp
- 源根 \src\main\java 和 \src\main\resources
- 库 所有的jar包都在,src 和 javaDoc 不用管
- Facet 和 上面 Web 设置一样。 Web部署描述符 等等
- 工作:有demo3:war 输出\demo3\target 归档类型
- demo3:war exploded 输出\demo3\target\demo3-1.0-SNAPSHOT 展开型
-
计算把 1 种的调整成 这样的格式,依然不能运行。
Java Enterprise
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<junit.version>5.7.1</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>
其他知识 配置文件不打包
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
引入依赖
- 下面 servlet-api太老了
<!--servlet 依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!--JSP 依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<!--JSTL 表达式依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!--standard 标签库-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
创建 servlet
//HttpServlet implements Servlet
public class ShowServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
//不指定编码,会发生乱码
//resp.setCharacterEncoding("utf-8");
resp.getWriter().write("你好呀,世界");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
配置 web.xml
- 在当前项目,web——WEB-INF——web.xml下
<web-app>
<servlet>
<servlet-name>ShowServlet</servlet-name>
<servlet-class>com.kuang.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
</web-app>
import javax.servlet.annotation.*;
@WebServlet(name = "showServlet",value = "/show")
public class ShowServlet extends HttpServlet {
//另一种使用,没有找到这个注解
//import javax.servlet.annotation.WebServlet;
//在 javax.servlet-api 4.0.1包
}
配置过滤器
// @WebFilter
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化了");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
//放行
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("销毁了");
}
}
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
Spring boot配置过滤器
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<Filter> baseFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyCharacterEncodingFilter());
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("/*");
filterRegistrationBean.setUrlPatterns(arrayList);
filterRegistrationBean.setOrder(1);
return filterRegistrationBean;
}
}
用户登录
编写登录和注销的 servlet
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
if (username.equals("admin")) {
req.getSession().setAttribute("user_session", req.getSession().getId());
/*Object user_session = req.getSession().getAttribute("user_session");
if (user_session!=null){
req.getSession().removeAttribute("user_session");
resp.sendRedirect("/Login.jsp");
}else {
resp.sendRedirect("/Login.jsp");
}*/
resp.sendRedirect("/sys/success.jsp");
} else {
resp.sendRedirect("/error.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
}
登录页面
<form action="/servlet/login" method="post">
<input type="text" name="username">
<input type="submit">
</form>
编写配置过滤器
public class SysFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse rep, FilterChain chain) throws IOException, ServletException {
//为了 拿到 session,向下转型。
HttpServletRequest request1 = (HttpServletRequest) req;
HttpServletResponse response1 = (HttpServletResponse) rep;
if (request1.getSession().getAttribute("user_session") == null) {
((HttpServletResponse) rep).sendRedirect("/error.jsp");
//response1.sendRedirect("/error.jsp"); 这种写法错误
//Cannot call sendError() after the response has been committed
}
chain.doFilter(req, rep);
}
@Override
public void destroy() {
}
}
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.kuang.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<url-pattern>/sys/*</url-pattern>
</filter-mapping>
监听器
public class OnlineCountListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
//也可以作为web应用的全局变量被所有Servlet和JSPs访问
//每一个web工程都只有一个ServletContext对象
ServletContext ctx = se.getSession().getServletContext();
//session销毁:1,手动销毁。2,配置过期时间。
se.getSession().invalidate();
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount == null) {
onlineCount = 1;
} else {
onlineCount++;
}
ctx.setAttribute("OnlineCount", onlineCount);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount == null) {
onlineCount = 0;
} else {
onlineCount--;
}
ctx.setAttribute("OnlineCount", onlineCount);
}
}
<listener>
<listener-class>com.kuang.listener.OnlineCountListener</listener-class>
</listener>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
- jsp中 获取 ServletContext
<%= this.getServletConfig().getServletContext().getAttribute("OnlineCount") %>
Spring boot拦截器(Mvc)
https://blog.csdn.net/someday____/article/details/126308356
创建
public class MyInterceptor implements HandlerInterceptor {// 实现HandlerInterceptor接口
/**
* 访问控制器方法前执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println(new Date() + "--preHandle:" + request.getRequestURL());
return true;
}
/**
* 访问控制器方法后执行。就是controller方法走完。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println(new Date() + "--postHandle:" + request.getRequestURL());
}
/**
* postHandle方法执行完成后执行,一般用于释放资源。
* 调用前提:preHandle返回true
* 调用时间:DispatcherServlet进行视图的渲染之后
* 多用于清理资源
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println(new Date() + "--afterCompletion:" + request.getRequestURL());
}
}
配置
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 添加Web项目的拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 对所有访问路径,都通过MyInterceptor类型的拦截器进行拦截
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/", "/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**");
//放行登录页,登陆操作,静态资源
}
}
tomcat
请你谈谈网站是如何进行访问的!1.输入一个域名;回车
⒉.检查本机的C:\Windows\System32\drivers\etc\hosts 配置文件下有没有这个域名映射;
1.有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
127.0.0.1
www. qinjiang.com
2.没有:去DNS服务器找,找到的话就返回,找不到就返回找不到;