HttpServletRequest与HttpServletResponse的实现类

        在前面总结过,每当客户端给Web服务器发送一个http请求,web服务器就会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象就代表请求和响应,所以我们可以通过request对象获得请求相关的数据和操作。通过response对象进行对响应相关的数据封装和一些其他的操作。

一.HttpServletRequest与HttpServletResponse的实现类

       我们会发现,HttpServletRequest与HttpServletResponse都是接口,那么它们在运行的时候的实现类是什么?是由谁负责实例化它们的实现类呢?

     通过对上一篇文章的HelloWorldServlet进行调试,可以得到答案。HelloWorldServlet的部分代码的截图如下所示:


     这张图是调试时获得的:


         通过上面的图我们可以看到,HttpServletRequest与HttpServletResponse的对象req,resp的实际的类型是RequestFacade和ResponseFacade。这两个类都是org.apache.catalina.connector包下面的。也就是我使用的web服务器tomcat的两个类。所以还是由web容器来负责实例化HttpServletRequest与HttpServletResponse的对象。

二.HttpServletRequest简介

     HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中。

     request常用的方法和操作:

1.获得客户端的信息

getRequestURL方法返回客户端发出请求时的完整URL。

getRequestURI方法返回请求行中的资源名部分,去掉主机名的部分。

getRemoteAddr方法返回发出请求的客户机的IP地址

getRemoteHost方法返回发出请求的客户机的完整主机名

getRemotePort方法返回客户机所使用的端口号

getLocalAddr方法返回WEB服务器的IP地址。

getLocalName方法返回WEB服务器的主机名

getMethod得到客户机请求方式,如GET,POST

2.获得请求头的一些方法

getHead(name)方法

getHeaders(String name)方法

getHeaderNames方法

3.获得请求参数,也就是客户端提交的数据的一些方法。

getParameter(name)方法

getParameterValues(String name)方法

getParameterNames方法

getParameterMap方法 

 

4.HttpServletRequest实现转发

        请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。

5. request域

         request对象同时也是一个域对象,我们通过request对象在实现转发时,可以把数据通过request对象带给其它web资源处理。下面是常用的一些对域中的属性的操作的方法:

setAttribute方法

getAttribute方法 

removeAttribute方法

getAttributeNames方法

6. Request的getParameter和getAttribute方法的区别。

       由于request也是一个域对象,所以既可以从它获得参数,即Parameter。也可以获得域中的属性。但是他们的意义是完全不一样的。

        getParameter(String  name)获得客户端传送给服务器的参数值,该参数是由name指定的,通常是表单中的参数。而且参数只能是字符串形式的键值对。

         getAttribute(String  name):返回有name 指定的属性值,如果指定的属性值不存在,则会返回一个null值。这里存放的也是一个键值对,不同的是,这里的值可以是任意的类型。

 

三.HttpServletResponse简介

   HttpServletResponse则是对服务器的响应对象。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。

   

response常用的方法和操作:

1.常用的方法

addCookie(Cookie cookie)  向客户端写入Cookie

addHeader(Java.lang.String name, java.lang.String value) 写入给定的响应头

encodeURL(java.lang.Stringurl) 默认cookie中包含Session ID,如果客户端不支持 Cookie,就在参数 url 中加入 Session ID 信息,可以解决用户禁用cookie的问题。

setStatus(intsc)  设置响应的状态码。

 

2. getOutputStream和getWriter方法的区别

getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。 

这两个方法写入的数据会作为响应消息的正文,与响应状态行和各响应头组合后输出到客户端。Serlvet的service方法结束后,web容器将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,web容器将调用close方法关闭该输出流对象。

3. HttpServletResponse实现重定向

       重定向指的是一个web资源收到客户端请求后,web服务器通知客户端去访问另外一个web资源,这称之为请求重定向。实现方式是调用response.sendRedirect()方法。实现的原理就是给客户端返回了302状态码和location头。

 

四.转发forward和重定向Redirect的区别

        转发是在服务器端实现的。一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

        而重定向是在客户端实现的。一个web资源收到客户端请求后,通知客户端的浏览器去访问另外一个web资源,称之为请求重定向。所以调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL。

         RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的其他资源; sendRedirect方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。

         HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端将请求转发给另外一个资源,相当过程于对客户端不可见。

         RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。也就是说,重定向生成了新的request对象和response对象。

  • 37
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Spring Security是一个基于Spring框架的安全框架,可以用来实现用户认证和授权等安全功能。要实现登录功能,可以通过配置Spring Security的相关组件来实现。 首先,需要配置一个UserDetailsService来获取用户信息,可以从数据库或其他数据源中获取。然后,需要配置一个PasswordEncoder来对用户密码进行加密。接着,需要配置一个AuthenticationManager来处理用户认证请求。最后,需要配置一个登录页面和登录成功后的跳转页面。 具体实现步骤可以参考Spring Security官方文档或相关教程。 ### 回答2: Spring Security是一个强大且灵活的安全框架,用于在Spring应用程序中实现身份验证和授权功能。要使用Spring Security实现登录,需要以下步骤: 1.添加Spring Security依赖项:在项目的构建文件中添加Spring Security的依赖项,例如Maven的pom.xml文件中添加以下代码: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` 2.配置安全规则:在Spring Boot的配置文件application.properties或application.yml中添加安全规则,例如: ```yaml spring: security: user: name: myusername password: mypassword # other security configurations ``` 上述示例中,配置了用户名和密码作为默认的身份验证信息。 3.创建登录表单页面:在前端创建一个登录表单页面,用于用户输入用户名和密码,并提交表单。 4.创建登录控制器:在后端创建一个登录控制器,用于处理登录请求。该控制器需要调用Spring Security的认证管理器对用户名和密码进行验证。 ```java @Controller public class LoginController { @GetMapping("/login") public String login() { return "login"; } @PostMapping("/login") public String authenticate(HttpServletRequest request, HttpServletResponse response) { // 调用Spring Security的认证管理器进行用户名和密码验证 Authentication auth = new UsernamePasswordAuthenticationToken(username, password); auth = authenticationManager.authenticate(auth); // 登录成功后的处理逻辑 SecurityContextHolder.getContext().setAuthentication(auth); return "redirect:/home"; } } ``` 5.配置Spring Security:在Spring Boot应用程序的配置中添加相关的Spring Security配置。例如,配置所有请求都需要进行身份认证: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll(); } } ``` 上述示例中,配置了所有请求都需要进行身份认证,并且允许通过/login页面进行登录。 这样,当用户访问需要身份验证的页面时,系统将自动跳转到登录页面,用户输入正确的用户名和密码后,系统将进行认证并授权,然后跳转到原来请求的页面。如果用户名或密码不正确,则登录失败并显示相应的错误消息。 以上是使用Spring Security实现登录的基本步骤。通过配置合适的规则和参数,可以实现更加复杂和安全的登录功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值