@ResponseBody
public String findCurrentUserInfo2(HttpServletRequest request) {
String sss = "北京你好!-jfQQQQ";
return sss;//.getBytes(StandardCharsets.UTF_8);
结论就是依旧不行:
并且可见原因是编码为ISO了!可是明明有调试源码,utf-8的properties设定的实体类有被创建,并且值就是utf-8啊!难道没用到那个类?(org.springframework.boot.web.servlet.server.Encoding)
结合上面的案例,得出的结论是我们配置的properties并没有起到作用,那么我们就需要找到起到作用的类和方法,spring中转换消息的类一般都是“***Convertor”,再加上我们返回的是text/html,类似于string,所以自然是找到了org.springframework.http.converter.StringHttpMessageConverter类,果不其然,里面的编码默认是ISO:
so,我们来调试一下,看看返回数据的时候是不是用到了它。
ok,确认了。
接下来,跟源码(org.springframework.http.converter.StringHttpMessageConverter中),返回数据时,会有一个判断响应头的逻辑,如果controller的函数返回时没有满足if中判断的条件:
那么,就执行默认的响应头(调用到了org.springframework.http.converter.AbstractHttpMessageConverter中的addDefaultHeaders方法),如下图:
同时,由于我只配置了produces为“text/html”,所以上面的断点处,就走到了获取
his.getDefaultCharset();
这一句,要去获取默认的charset,我们看看它要去从哪里获取:
还是org.springframework.http.converter.AbstractHttpMessageConverter中,它自己存储了默认的编码值:
这个defaultCharset是在创建时指定的,截图时是utf-8。
不过这个属性是在创建时指定的,我们看看这个属性是在哪里赋值的。
赋值是在创建时指定的(org.springframework.http.converter.AbstractHttpMessageConverter):
上面的创建是在下图被调用的
然后上图是在下图被调用的
然后下图就是上图用到的默认编码值,于是走到迷宫尽头了,可以出宫了。
所以,关键问题就在于我们让springboot启动初始化时,将类的默认编码换为utf-8就行了,而那个类是StringHttpMessageConverter 。
所以,我们要这样自创建一个bean,设定它的类别,再注入到spring上下文中,替换其默认的bean。
@Bean
public HttpMessageConverter<String> responseBodyConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter(
Charset.forName("UTF-8"));
return converter;
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(responseBodyConverter());
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Bean
public HttpMessageConverter<String> responseBodyConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter(
Charset.forName("UTF-8"));
return converter;
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(responseBodyConverter());
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
用这种方式配置后,就可以不在controller中做特殊处理来使用了。
在做拦截器中,没有该注解,所以不会对返回的类做处理,所以返回的就是toString后的对象。所以在redsponse参数中,一定事先使用使用JSON.toJSONString(userResult)对类对象进行一...
HttpServletRequest request =((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
HttpServletResponse response =((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
一般使用
HttpServletReque.
HttpServletRequest request =((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
HttpServletResponse response =((ServletRequestAttributes)RequestContextHolder.getRe...
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServl
@WebServlet("/wx")
public class WxServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void.
1、通过Springboot程序可以发现,Springboot中控制器的形式和Springmvc中是一样的,因此在程序中使用jsp的内置对象也可以按照与Springmvc同样的方式进行。
1 package org.springboot.tentent.controller;
3 import java.util.HashMap;
4 import java.util.M...
2、支持跨域,不限制跨域(????????,最后还是采用了这个)
配置跨域支持
两个前段一个后台,如果用Nginx配置一下不同的域名转发一下也没有问题,但由于合作方基本不用Nginx,全靠slb拦截之类的骚操作,导致后端只能开放为允许跨域。
配置方式很简单,直接给贴个全的,感动不感动,-,-
@Configuration
public class WebMv
@RequestMapping("/testServletAPI")
public void testServletAPI(HttpServletRequest request,
HttpServletResponse response,HttpSession session,
Write r out) throws IOException{
通常来说依赖注入的对象一旦创建完成后就不会在改变,因为Spring的默认行为创建的都是单例对象。和不是单例对象,它们都是根据HTTP请求进行创建的,一个HTTP请求对象一个request和response。但是通过@Autowired可以实现每当一个请求进来时使用的都是当前的request或response对象,演示代码如下。
根据浏览器提交的账号密码返回登录成功或者失败
这一步本来应该通过访问数据库来实现,这里简化一下,直接在内存中进行校验
如果账号是 admin,密码是123, 就返回登录成功,否则返回登录失败
步骤1:先运行,看到效果,再学习步骤2:模仿和排错步骤3:LoginServlet步骤4:重启tomcat,提交数据
步骤1:先运行,看到效果,再学习
老规矩,先下载下载区(点击进入)的...