Alone88 - Java https://alone88.cn/category/Java zh-CN Thu, 21 Jan 2021 16:23:57 +0800 Thu, 21 Jan 2021 16:23:57 +0800 SpringBoot Actuator 默认找不到 HttpTrace 的问题 https://alone88.cn/archives/936.html https://alone88.cn/archives/936.html Thu, 21 Jan 2021 16:23:57 +0800 Alone88 SpringBoot Actuator 默认找不到 HttpTrace 的问题

Spring 文档地址:https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/production-ready-features.html#production-ready-http-tracing

给Spring 注册一个 HttpTraceRepository bean 就可以了

官方提供了一个 InMemoryHttpTraceRepository 存在内存里面的 http trace, 默认保存100条请求记录

请输入图片描述

请输入图片描述

]]>
0 https://alone88.cn/archives/936.html#comments https://alone88.cn/feed/archives/936.html
SpringBoot 整合 Nacos Config 实现配置文件动态更新 https://alone88.cn/archives/838.html https://alone88.cn/archives/838.html Thu, 28 May 2020 10:14:40 +0800 Alone88 前提条件

安装好 nacos, 初始化 SpringBoot 项目

nacos 官方地址:https://nacos.io/zh-cn/

使用版本

Springboot 2.2.2.RELEASE
Nacos config 0.2.7

导入 Nacos 依赖

        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.7</version>
        </dependency>

设置配置文件

设置 application.yml

spring:
  application:
    name: alone88-nacos-config
nacos:
  config:
    data-id: alone88-nacos-config # nacos 配置的 data-id
    server-addr: 127.0.0.1:8848 # nacos 服务器地址
    group: ALONE88 # 配置文件 Group
    namespace: 4afce008-bdf4-4ee5-92d5-5e2fe491f41d # 命名空间ID
    type: yaml # nacos 配置文件类型
    auto-refresh: true # 是否启用动态刷新配置
    bootstrap:
      enable: true # 这个需要为 true, 否则启动项目时不设置 value默认值会报错,也不会自动更新,请查看 NacosConfigApplicationContextInitializer 文件

登录 nacos 设置配置文件

1.png

2.png

编写 controller 测试

@RestController
@RequestMapping("config")
public class Controller {
    @NacosValue(value = "${alone88.name}", autoRefreshed = true)
    private String name;

    @GetMapping("get")
    public String get() {
        return this.name;
    }
}
]]>
0 https://alone88.cn/archives/838.html#comments https://alone88.cn/feed/archives/838.html
SpringBoot 整合 Cacheable https://alone88.cn/archives/822.html https://alone88.cn/archives/822.html Thu, 16 Apr 2020 18:20:43 +0800 Alone88 maven 依赖
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

配置启动类

在启动类上添加 @EnableCaching

@SpringBootApplication
@EnableCaching
public class ShortUrlApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShortUrlApplication.class, args);
    }
    
}

注解说明

  1. @Cacheable :对方法结果进行缓存(主要用于GET方法)
    1. cacheNames/value:指定缓存主键(Cache)的名字
    2. key:缓存数据使用key,支持spEl语法
    3. keyGenerator:key的生成器。与key属性冲突,自定义 keyGenerator 必须实现org.springframework.cache.interceptor.KeyGenerator,default使用默认的参数值生成器
    4. cacheManager:指定缓存管理器,或者cacheResolver指定获取解析器
    5. cacheResolver: 与CacheManager冲突
    6. condition:指定条件满足才缓存,与unless相反。可以使用spEL语法
    7. unless:否定缓存,当满足条件时,结果不被缓存。可以获取到结果(#result)进行判断。支持spEL语法
    8. sync:是否异步模式。在该模式下unless不被支持。default=false
  2. @CachePut:先调用方法,在对结果进行缓存。(主要用于PUT方法),需要注意key的设置
  3. @CacheEvict:默认先调用方法,在删除缓存(主要用于DELETE方法)
    1. allEntries: 删除缓存组件中(cacheNames/value指定)所有的值
    2. beforeInvocation:在方法执行之前删除值,default=false
  4. @Caching:组合注解。针对复杂情况
  5. @CacheConfig:加载类上,用于设置缓存的共有属性
]]>
0 https://alone88.cn/archives/822.html#comments https://alone88.cn/feed/archives/822.html
springboot 整合 alibaba druid https://alone88.cn/archives/819.html https://alone88.cn/archives/819.html Thu, 16 Apr 2020 18:12:00 +0800 Alone88

阿里巴巴数据库事业部出品,为监控而生的数据库连接池 https://github.com/alibaba/druid/wiki

maven 安装

<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
     <version>1.1.16</version>
</dependency>

设置配置

druid 属性详情 可参考 :https://www.cnblogs.com/halberd-lee/p/11304790.html

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: 
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      clear-filters-enable: true
      initial-size: 1
      max-active: 20
      max-wait: 60000
      filters: stat,wall,slf4j

启动配置类

@Configuration
public class DruidConfiguration {
    @Bean
    public ServletRegistrationBean<StatViewServlet> statViewServlet() {
        ServletRegistrationBean<StatViewServlet> servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
//设置ip白名单
        servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
        //设置ip黑名单,如果allow与deny共同存在时,deny优先于allow
        servletRegistrationBean.addInitParameter("deny", "192.168.0.19");
        //设置控制台管理用户
        servletRegistrationBean.addInitParameter("loginUsername", "admin");
        servletRegistrationBean.addInitParameter("loginPassword", "123456");
        //是否可以重置数据
        servletRegistrationBean.addInitParameter("resetEnable", "false");
        return servletRegistrationBean;
    }
    @Bean
    public FilterRegistrationBean<WebStatFilter> statFilter() {
        //创建过滤器
        FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(new WebStatFilter());
        //设置过滤器过滤路径
        filterRegistrationBean.addUrlPatterns("/*");
        //忽略过滤的形式
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
}

然后就可以通过 http://localhost:8080/druid/ 登录可视化界面了

]]>
0 https://alone88.cn/archives/819.html#comments https://alone88.cn/feed/archives/819.html
Springboot 设置时区问题 https://alone88.cn/archives/718.html https://alone88.cn/archives/718.html Thu, 28 Nov 2019 10:07:40 +0800 Alone88 Springboot 设置时区问题

默认的Springboot 时区总是少8个小时

解决办法
在配置文件添加时区 application.yml
1.

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=Asia/Shanghai 
  1. 在启动类添加设置时区方法
@PostConstruct
void setDefaultTimezone() {
 TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
} 
]]>
0 https://alone88.cn/archives/718.html#comments https://alone88.cn/feed/archives/718.html
Servlet 通过Filter拦截器解决全站编码问题 https://alone88.cn/archives/654.html https://alone88.cn/archives/654.html Mon, 16 Sep 2019 16:29:39 +0800 Alone88 Servlet 通过Filter解决全站编码问题

创建代理类

package cn.facade;
import    java.util.regex.Matcher;
import java.util.regex.Matcher;
import    java.util.regex.Pattern;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.UnsupportedEncodingException;


public class CharSetHttpRequest extends HttpServletRequestWrapper {

    public CharSetHttpRequest(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getParameter(String name) {

        ServletContext context = getServletContext();//获取ServletContext
        String value = super.getParameter(name);//获取参数

        // 正则判断Tomcat版本
       String reg = ".*(Tomcat/8).*";

       String ServerInfo = context.getServerInfo();

       Pattern pattern = Pattern.compile(reg);

        Matcher matcher = pattern.matcher(ServerInfo);

        //如果是Tomcat8的版本则不进行编码转换
       if(!matcher.find()){
           // 判断是否Get方式
           if(getMethod().equalsIgnoreCase("GET")){
               try {
                   // 转换编码
                   value = new String(value.getBytes("iso-8859-1"),"utf-8");
               } catch (UnsupportedEncodingException e) {
                   e.printStackTrace();
               }

           }
       }

       return value;
    }
}

创建拦截器

package cn.alone88;

import cn.facade.CharSetHttpRequest;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter(filterName = "CharSetFilter")
public class CharSetFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        CharSetHttpRequest request = new CharSetHttpRequest((HttpServletRequest) req);
        chain.doFilter(request, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

编辑web.xml 实现全站拦截

<filter>
        <filter-name>charset</filter-name>
        <filter-class>cn.alone88.CharSetFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>charset</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

这样所有的请求都会先拦截处理后在进入Servlet

]]>
0 https://alone88.cn/archives/654.html#comments https://alone88.cn/feed/archives/654.html
关于Servlet 中文编码问题,Tomcat版本的影响 https://alone88.cn/archives/650.html https://alone88.cn/archives/650.html Mon, 16 Sep 2019 15:49:00 +0800 Alone88 Servlet 编码问题

Servlet获取参数编码的问题,在8.0之前,tomcat默认的编码是ISO-8859-1的,tomcat在8.0以后,默认的编码就变成UTF-8
所以在tomcat8.0后的版本都不需要处理Get方式的编码问题,而POST方式还是需要设置一下 request的编码就可以了
这里讲的是Tomcat8.0以前的版本

数据来源编码格式
浏览器页面GBK
request(Get)ISO-8859-1
request(Post)GBK,Servlet可以设置接受格式
responseISO-8859-1

处理中文的方法

request(Get)::

String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");

request(POST)

request.setCharacterEncoding("UTF-8");

response

response.setContextType("text/html;charset=utf-8");
]]>
0 https://alone88.cn/archives/650.html#comments https://alone88.cn/feed/archives/650.html